﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using habilitaciones.controller.bussines;
using habilitaciones.core.modelo;
using System.Configuration;
using habilitaciones.core.util;
using habilitaciones.web.Models;
using habilitaciones.core.util;

namespace Habilitaciones.ui.Controllers
{
    [HandleError]
    public class HabilitacionesController : Controller
    {
        public class webVehiculo
        {
            public string dominio { get; set; }
            public string marca { get; set; }
            public string modelo { get; set; }
            public string tipo { get; set; }
            public string año { get; set; }
            public string NroMotor { get; set; }
            public string nroChasis { get; set; }
            public string odometro { get; set; }
            public string CiaSeguro { get; set; }
            public string nroPoliza { get; set; }
            public string vence { get; set; }
        }

        public class webPersona
        {
            public byte tipo { get; set; }
            public string documento { get; set; }
            public string sexo { get; set; }
            public string apellido { get; set; }
            public string nombre { get; set; }
            public DateTime fechanac { get; set; }
            public string calle { get; set; }
            public string nro { get; set; }
            public string localidad { get; set; }
            public string nroRegistro { get; set; }
            public string expedidoPor { get; set; }
            public string LibretaSanitariaNro { get; set; }
            public string Vencimiento { get; set; }
            public string UrlFoto { get; set; }
            public string UrlFirma { get; set; }
            public string UrlPulgarD { get; set; }
            public string UrlPulgarI { get; set; }
        }
        public ModeloHabilitaciones Modelo
        {
            get
            {

                if (Session["Modelo"] == null)
                    Session["Modelo"] = new ModeloHabilitaciones(ConfigurationManager.ConnectionStrings["cnxHabilitaciones"].ConnectionString);
                return (ModeloHabilitaciones)Session["Modelo"];
            }
            set
            {
                Session["Modelo"] = value;
            }
        }

        public ActionResult Index()
        {
            ViewData["Message"] = "Busqueda de habilitaciones";

            ViewData["Busquedas"] = new SelectList(traerBusquedas(), "IdBusqueda", "Nombre");

            return View();
        }

        public ActionResult Alta()
        {
            ViewData["Message"] = "Alta Habilitación";
            ViewData["Rubros"] = new SelectList(traerRubros(), "IdRubro", "Rubro");

            ViewData["dni_tipo"] = new SelectList(traerTiposDocumento(), "IdTipoDocumento", "TipoDocumento");
            ViewData["localidades"] = new SelectList(traerLocalidades(), "IdLocalidad", "Localidad");
            ViewData["municipios"] = new SelectList(traerMunicipios(), "IdMunicipio", "Municipio");

            return View();
        }

        private List<Municipios> traerMunicipios()
        {
            return Modelo.TraerMunicipios();
        }

        private List<Localidades> traerLocalidades()
        {
            return Modelo.TraerLocalidades();
        }

        private List<Busqueda> traerBusquedas()
        {
            List<Busqueda> resultado = new List<Busqueda>();

            Busqueda b = new Busqueda();
            b.IdBusqueda = 1; b.Nombre = "Por Documento";
            resultado.Add(b);

            Busqueda b1 = new Busqueda();
            b1.IdBusqueda = 2; b1.Nombre = "Nro Autorización";
            resultado.Add(b1);

            Busqueda b2 = new Busqueda();
            b2.IdBusqueda = 3; b2.Nombre = "Por Apellido y Nombre";
            resultado.Add(b2);

            Busqueda b3 = new Busqueda();
            b3.IdBusqueda = 4; b3.Nombre = "Por Dominio";
            resultado.Add(b3);

            return resultado;
        }

        private List<Rubros> traerRubros()
        {
            return Modelo.TraerRubros();
        }

        private List<TiposDocumento> traerTiposDocumento()
        {
            return Modelo.TraerTiposDocumentos();
        }

        public ActionResult BuscarPersona(int idBusqueda, string valor)
        {

            //Documento
            if (idBusqueda == 1)
                this.Modelo.Lista = Modelo.BuscarHabilitacionPorDocumento(valor);
            if (idBusqueda == 2)
                this.Modelo.Lista = null; //a.BuscarHabilitacionPorNroAutorizacion(valor);
            if (idBusqueda == 3)
                this.Modelo.Lista = null; //a.BuscarHabilitacionPorApellidoYNombre(valor);
            if (idBusqueda == 4)
                this.Modelo.Lista = null; //a.BuscarHabilitacionPorDominio(valor);

            return Json(new { ok = true, error = "" });
        }


        public ActionResult CargarVehiculo()
        {
            return Json(CargarVehiculoDelModelo());
        }

        public ActionResult BuscarPersonaDocumento(string dni)
        {

            this.Modelo.BuscarPersonaPorDocumento(dni);
            return Json(CargarPersonaDelModelo(), JsonRequestBehavior.AllowGet);
        }

        public ActionResult CargarPersona()
        {
            return Json(CargarPersonaDelModelo());
        }

        private webPersona CargarPersonaDelModelo()
        {
            webPersona pw = new webPersona();
            if (this.Modelo.PersonaSeleccionada != null)
            {
                pw.tipo = (this.Modelo.PersonaSeleccionada.TiposDocumento != null) ? this.Modelo.PersonaSeleccionada.TiposDocumento.IdTipoDocumento : byte.Parse("1");
                pw.documento = this.Modelo.PersonaSeleccionada.NroDocumento.ToString();
                pw.sexo = this.Modelo.PersonaSeleccionada.Sexo;
                pw.apellido = this.Modelo.PersonaSeleccionada.Apellido;
                pw.nombre = this.Modelo.PersonaSeleccionada.Nombre;
                pw.fechanac = this.Modelo.PersonaSeleccionada.FechaNacimiento.HasValue ? this.Modelo.PersonaSeleccionada.FechaNacimiento.Value : DateTime.Parse("01/01/1970");
                pw.calle = this.Modelo.PersonaSeleccionada.Calle;
                pw.nro = this.Modelo.PersonaSeleccionada.NroPuerta;
                pw.localidad = this.Modelo.PersonaSeleccionada.Localidades != null ? this.Modelo.PersonaSeleccionada.Localidades.Localidad : "";
                pw.nroRegistro = this.Modelo.PersonaSeleccionada.RegistroNro.HasValue ? this.Modelo.PersonaSeleccionada.RegistroNro.Value.ToString() : "";
                pw.expedidoPor = this.Modelo.PersonaSeleccionada.ExpedidoPor;
                pw.LibretaSanitariaNro = this.Modelo.PersonaSeleccionada.LibretaSanitariaNro.HasValue ? this.Modelo.PersonaSeleccionada.LibretaSanitariaNro.Value.ToString() : "";
                pw.Vencimiento = this.Modelo.PersonaSeleccionada.Vencimiento.HasValue ? this.Modelo.PersonaSeleccionada.Vencimiento.Value.ToShortDateString() : "";
                pw.UrlFoto = this.Modelo.PersonaSeleccionada.UrlFoto;
                pw.UrlFirma = this.Modelo.PersonaSeleccionada.UrlFirma;
                pw.UrlPulgarD = this.Modelo.PersonaSeleccionada.UrlHuella;
                pw.UrlPulgarI = this.Modelo.PersonaSeleccionada.UrlHuella;
            }
            return pw;
        }


        public ActionResult GuardarVehiculo(string dominio, string marca, string modelo, string modeloAnio, string nroChasis, string nroMotor, string odometro, string polizaSegCompania, string polizaSegNro, DateTime polizaSegVencimiento, string tipo)
        {
            short anio;
            if (short.TryParse(modeloAnio, out anio))
            {
                SetearVehiculoAlModelo(dominio, short.Parse(modeloAnio), polizaSegCompania, marca, modelo, nroChasis, nroMotor, polizaSegNro, odometro, polizaSegVencimiento, tipo);
                return Json(new { ok = true, error = "" }, JsonRequestBehavior.AllowGet);
            }
            else
                return Json(new { ok = false, error = "Especifique el año del vehículo" }, JsonRequestBehavior.AllowGet);

        }

        public ActionResult GuardarPersona(string tipo, string documento, string nombre, string apellido, DateTime fecnac, string sexo, string domicilio, string nro, string depto, string municipio, string localidad)
        {
            int nro_doc;

            if (int.TryParse(documento, out nro_doc))
            {
                SetearPersonaAlModelo(dominio, short.Parse(modeloAnio), polizaSegCompania, marca, modelo, nroChasis, nroMotor, polizaSegNro, odometro, polizaSegVencimiento, tipo);
                return Json(new { ok = true, error = "" }, JsonRequestBehavior.AllowGet);
            }
            else
                return Json(new { ok = false, error = "Especifique el año del vehículo" }, JsonRequestBehavior.AllowGet);

        }

        public ActionResult BuscarVehiculoPorDominio(string dominio)
        {
            Modelo.BuscarVehiculoPorDominio(dominio);
            return Json(CargarVehiculoDelModelo());
        }

        private webVehiculo CargarVehiculoDelModelo()
        {
            webVehiculo wv = new webVehiculo();
            if (this.Modelo.VehiculoSeleccionado != null)
            {
                wv.dominio = this.Modelo.VehiculoSeleccionado.Dominio;
                wv.año = this.Modelo.VehiculoSeleccionado.ModeloAnio.ToString();
                wv.CiaSeguro = this.Modelo.VehiculoSeleccionado.PolizaSegCompania;
                wv.marca = this.Modelo.VehiculoSeleccionado.Marca;
                wv.modelo = this.Modelo.VehiculoSeleccionado.Modelo;
                wv.nroChasis = this.Modelo.VehiculoSeleccionado.InternoNro;
                wv.NroMotor = this.Modelo.VehiculoSeleccionado.MotorNro;
                wv.nroPoliza = this.Modelo.VehiculoSeleccionado.PolizaSegNro;
                wv.odometro = this.Modelo.VehiculoSeleccionado.RelojNro;
                wv.vence = this.Modelo.VehiculoSeleccionado.PolizaSegVencimiento.HasValue ? this.Modelo.VehiculoSeleccionado.PolizaSegVencimiento.Value.ToShortDateString() : "";
                wv.tipo = this.Modelo.VehiculoSeleccionado.Tipo;
            }
            return wv;
        }

       
        private void SetearVehiculoAlModelo(string dominio, short anio, string polizaCnia, string marca, string modelo, string chasis, string nroMotor, string nroPoliza, string odometro, DateTime? fechaVencimiento, string tipo)
        {

            this.Modelo.VehiculoSeleccionado.Dominio = dominio;
            this.Modelo.VehiculoSeleccionado.ModeloAnio = anio;
            this.Modelo.VehiculoSeleccionado.PolizaSegCompania = polizaCnia;
            this.Modelo.VehiculoSeleccionado.Marca = marca;
            this.Modelo.VehiculoSeleccionado.Modelo = modelo;
            this.Modelo.VehiculoSeleccionado.InternoNro = chasis;
            this.Modelo.VehiculoSeleccionado.MotorNro = nroMotor;
            this.Modelo.VehiculoSeleccionado.PolizaSegNro = nroPoliza;
            this.Modelo.VehiculoSeleccionado.RelojNro = odometro;
            this.Modelo.VehiculoSeleccionado.PolizaSegVencimiento = fechaVencimiento;
            this.Modelo.VehiculoSeleccionado.Tipo = tipo;

        }

        public ActionResult Lista(string sidx, string sord, int page, int rows)
        {

            // <<declaraciòn e inicializaciòn de variables>>
            IList<Ordenes> lista = this.Modelo.Lista;


            // <<procesamiento>> <<resultado>>
            return
                this.List<Ordenes>(lista,
                    delegate(Ordenes ord)
                    {
                        if (sidx.ToUpper() == "NROHABILITACION")
                            return ord.NroHabilitacion;
                        else if (sidx.ToUpper() == "NroDocumento")
                            return ord.Titular.NroDocumento;
                        else if (sidx.ToUpper() == "Apellido")
                            return ord.Titular.Apellido;
                        else if (sidx.ToUpper() == "Nombre")
                            return ord.Titular.Nombre;
                        else if (sidx.ToUpper() == "Dominio")
                            return ord.Vehiculos.Dominio;
                        else if (sidx.ToUpper() == "Marca")
                            return ord.Vehiculos.Marca;
                        else if (sidx.ToUpper() == "Modelo")
                            return ord.Vehiculos.Modelo;
                        else
                            return ord.Vehiculos.ModeloAnio;
                    },
                    delegate(Ordenes ord)
                    {
                        return new
                        {
                            id = ord.IdOrden,
                            cell = new[] {                                    
                                ord.NroHabilitacion.ToString(),
                                ord.Titular.NroDocumento.ToString(),
                                ord.Titular.Apellido,
                                ord.Titular.Nombre,
                                ord.Vehiculos.Dominio,
                                ord.Vehiculos.Marca,
                                ord.Vehiculos.Modelo,
                                ord.Vehiculos.ModeloAnio.ToString()
                            }
                        };
                    }, sidx, sord, page, rows);
        }

        protected ActionResult List<TSource>(IList<TSource> list,
            Func<TSource, object> fProperty, Func<TSource, object> fSelect,
            string sidx, string sord, int page, int rows)
        {
            int pageIndex = Convert.ToInt32(page) - 1;
            int pageSize = rows;
            int totalRecords = (list == null) ? 0 : list.Count;
            var totalPages = (int)Math.Ceiling(totalRecords / (float)pageSize);

            // <<procesamiento>>
            // Ordena y recupera las empresas de la pagina a visualizar
            var newrows =
                (list == null)
                    ? new object[] { }
                    : this.OrderBy<TSource>(list, sord, fProperty)
                        .Skip(pageIndex * pageSize)
                        .Take(pageSize)
                        .Select(fSelect).ToArray();

            // construye el objeto a retornar
            var jsonData = new
            {
                total = totalPages,
                page = page,
                records = totalRecords,
                rows = newrows
            };

            // <<resultado>>
            return Json(jsonData, JsonRequestBehavior.AllowGet);
        }
        protected IOrderedEnumerable<TSource> OrderBy<TSource>(IList<TSource> list, string sord, Func<TSource, object> fProperty)
        {
            // <<procesamiento>> <<resultado>>
            return (sord.ToUpper().Equals("DESC"))
                ? list.OrderByDescending(fProperty)
                : list.OrderBy(fProperty);
        }

    }
}
